<?php
class Delivery_Model_Mapper_Opciones
	extends Delivery_Model_Mapper_Abstract
{
	
	public function getDbTable()
	{
		return parent::getDbTable( 'Opciones' );
	}
	
	
    public function save ( $opcion, $disactiveIfInAnyOrder = true ){
		
		$dbTable= $this->getDbTAble();
		
		if ( ! $opcion->getId() ){	
			$opcion->idOpcion = $dbTable->insert( $opcion );
		} else {							
			
			$mapper1 = Delivery_Model_Factory::mapper('ProductosPedido');
			//chequeo si el producto esta en algún pedido
			if ( $disactiveIfInAnyOrder && $mapper1->inAnyOrderOpcion( $opcion->getId() )){			
				
			    $this->_disactive( $opcion->getId() );
				
				$opcion->idOpcion = null;
				$opcion->idOpcion = $dbTable->insert( $opcion );
			}else {
				$dbTable->update( $opcion );	
			}	
		}			
		
		return $this;
	}
	
	/**
	 * @param object $opcion
	 * @return boolean
	 */
	public function delete( $opcion ){
	
		$dbTable= $this->getDbTAble();
		
		//chequeo si la opción esta en algun pedido
		$mapper1 = Delivery_Model_Factory::mapper('ProductosPedido');
		$inAnyOrder = $mapper1->inAnyOrderOpcion( $opcion->getId() );
		
		
		//chequeo si el producto esta en algún pedido
		if ( $mapper1->inAnyOrderOpcion( $opcion->getId() ) ){			
			
			$opcion->activo = 0;
			return $dbTable->update(  $opcion  );
			
		} else {
			$this->logDeleted( $opcion );
		}
		
		return $dbTable->delete( $opcion );
	}
	
	
	
	/**
	 * @param int $idOpcion
	 * @param int $idNegocio
	 * @return object Delivery_Model_Producto
	 */
	public function getById( $idOpcion , $idNegocio = null  )
	{
		if ( $this->getIdentityMap()->isRegistered( 'Delivery_Model_Opcion', $idOpcion )){
			return $this->getIdentityMap()->get( 'Delivery_Model_Opcion', $idOpcion );
		}
		
		$dbTable= $this->getDbTAble();
		$row	= $dbTable->getById( $idOpcion, $idNegocio );
	
		if( empty($row) ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::OPCION_NOT_FOUND );
		}
		
		return $this->_fetch( $row );
	}
	
	public function getByOpcionFamilia( $idOpcionFamilia, $idNegocio = null )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Opciones',
			$dbTable->getByOpcionFamilia( $idOpcionFamilia, $idNegocio )
		);
	}
	
    public function getByIds( $ids )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Opciones',
			$dbTable->getByIds( $ids )
		);
	}
	
	/**
	 * @param array
	 * @return array objetos opcion
	 */
	public function getByParams( $params, $offset = null, $limit = null, $order = null ){
		
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Opciones',
			$dbTable->getByParams($params, $offset, $limit, $order)
		);
	}
	
	public function countByParams( $params ){
		return $this->getDbTAble()->countByParams($params);
	}
	
	public function loadFamilia( $opciones )
	{
		$mapper = Delivery_Model_Factory::mapper('OpcionesFamilias');
		
		if (  $opciones instanceof Delivery_Model_Collection_Opciones ){

			if (count( $opciones ) < 1){
				return;
			}
			
			$familias = $mapper->getByIds( $opciones->getKeyValues( 'idOpcionFamilia', true ) );
			
			foreach ( $opciones as $opcion){
				$opcion->setFamilia(
					$familias->offsetGet( $opcion->idOpcionFamilia )
				);
			}
		}
	 	elseif ( $opciones instanceof Delivery_Model_Opcion){
			
	 		$opciones->setFamilia(
	 			$mapper->getById( $opciones->idOpcionFamilia )
	 		);
		}
	}
	
	
	/**
	 * @param array
	 * @return object Delivery_Model_Opcion
	 */
	protected function _fetch( $row )
	{
		$opcion = new Delivery_Model_Opcion( $row );
		
		$this->getIdentityMap()->set( $opcion, $opcion->getId() );
		
		return $opcion;
	}
	
	/**
	 * Si una opcion esta en un pedido y es modificada
	 * guardo una copia exacta de la misma desactivada
	 * 
	 * @param int idOpcion
	 * @return void
	 */
	protected function _disactive( $idOpcion)
	{
	    $opcion = $this->getById( $idOpcion );
	    $opcion->activo = 0;
	    $this->getDbTAble()->update(  $opcion  );
	}
	
}